package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 高级流---传输对象---实现序列化接口Serializable:功能：将对象转换为二进制
 *                   版本号：一定要写，对象写出，对象读入，必须统一版本号
 * ObjectOutputStream 对象输出流  写出--Person.java
 * ObjectInputStream  对象输入流   读入--Person.java
 */
public class ObjectIo {

    @Test
    public void testOOS() throws IOException {
//传输对象:创建实现序列化接口的对象
        Person1 p=new Person1();
        p.setNames("韩美娟");
        //String[] say=new String[]{}
        //字符串长度：动态数组传输--给定元素决定长度
        p.setSay(new String[]{"百因必有果，你的报应就是我~"});
        //传输符合条件对象--输出流--xxx.obj 文件是一种对象文件保存格式
        FileOutputStream fos=new FileOutputStream("person.obj");
        //高级流：ObjectOutputStream(fos);
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        /**
         * writeObject(Object obj)--写出对象
         * 作用：将给定对象按照其结构进行转换，转换为一组组字节，
         * 再通过处理的流写出，写出格式：xxx.obj
         *
         * 抛出异常：NotSerializableException 没有实现序列化接口
         * 原因：传输对象上没有实现Serializable序列化接口
         *
         *
         * person 类--去掉实现序列化接口：Serializable
         *
         * 对象文件写出操作需要两个步骤：专业术语
         * 1.通过对象输出流将Person类，转换为一组“组"字节，这个过程对象序列化
         * 2.将序列化后的每组的字节数据在通过字节流(低级流)写出到项目中(硬盘
         * 做长久的保存，这个过程:数据持久化!
         */

        oos.writeObject(p);
    }
    /**
     * ObjectInputStream 对象输入流--per.obj--读入
     * 反序列化--二进制转换为对象
     *
     * InvalidClassException 反序列化出现异常：版本号不匹配
     *
     * ClassNotFoundException 没有这个类型异常
     *                        产生原因：读入对象不正确，永久保存数据，类型读入不对
     *                          person1.class
     *                          person2.class
     */
    @Test
    public void testOIS() throws IOException, ClassNotFoundException {
        //创建输入流---person.obj--读入
        FileInputStream fis=null;
        fis=new FileInputStream( "person.obj");
        //创建高级流---对象输入流
        ObjectInputStream ois=null;
        ois=new ObjectInputStream(fis);
        //readObject() 返回读取的对象，反序列操作
        System.out.println(ois.readObject());
    }
}